package org.sloth.core.kv
{
	import org.sloth.core.StringUtil;

	/**
	 * 解析指定字符串为 <code>key=value</code> 形式，每组 <code>key=value</code> 由换行符(\n,\r)分隔<br/>
	 * （<code>key</code>：由正则表达示 <code>\w</code> 定义，<code>value</code>：任意。<code>key</code>和<code>value</code>都会去掉首尾空白字符）
	 * 
	 */	
	public dynamic class KVLibrary
	{
//============================================================================
//PROPERTY
//============================================================================
		/** 指定字符串 */
		protected var $cfg:String;
		/** 行注释正则表达式 */
		protected var $regLine:RegExp;
		/** 段注释正则表达式 */
		protected var $regSegment:RegExp;
//============================================================================
//CONSTRUCTOR
//============================================================================
		/**
		 * @param property 指定字符串
		 * @param regLine 行注释正则表达式
		 * @param regSegment 段注释正则表达式
		 * 
		 */		
		public function KVLibrary(cfg:String, regLine:RegExp = null, regSegment:RegExp = null)
		{
			if (cfg == null) return;
			$cfg = cfg;
			$regLine = regLine;
			$regSegment = regSegment;
			parse();
		}
//============================================================================
//PROTECTED
//============================================================================
		/**
		 * 解析字符串
		 * @param regLine
		 * @param regSegment
		 * 
		 */		
		protected function parse():void
		{
			var config:String = $cfg;
			if ($regLine != null) config = config.replace($regLine, "");//删除行注释
			if ($regSegment != null) config = config.replace($regSegment, "");//删除段注释
			config = config.replace(/\r/g, "\n").replace(/\n+/g, "\n");//格式化换行标识
			var kvsUndressed:Array = config.split(/\n/);//按行分组
			
			var index:int;
			var kv:String;
			var kvs:Array = [];
			for (index = kvsUndressed.length - 1;index >= 0;index--)
			{
				kv = kvsUndressed[index];
				kv = StringUtil.strim(kv);
				if (isKeyValue(kv)) kvs.push(kv);
			}
			
			var k:String;
			var v:String;
			var indexEqual:int;
			for (index = kvs.length - 1;index >= 0;index--)
			{
				kv = kvs[index];
				indexEqual = kv.indexOf("=");
				k = StringUtil.strim(kv.substring(0, indexEqual));
				v = StringUtil.strim(kv.substr(indexEqual + 1));
				this[k] = v;
			}
		}
		/**
		 * 判断指定字符串是否为 <code>key=value</code>形式
		 * @param value
		 * @return 
		 * 
		 */		
		protected function isKeyValue(value:String):Boolean
		{
			var regKV:RegExp = /^\s*\w+\s*=.*$/;
			return regKV.test(value);
		}


	}
}